package main

import (
	"fmt"
	"reflect"
)

func reflectNum(arg interface{}) {
	fmt.Println("type:", reflect.TypeOf(arg))
	fmt.Println("value:", reflect.ValueOf(arg))
}

type User struct {
	Id   int
	Name string
	Age  int
}

func (u User) Call() {
	fmt.Println(u.Name)
}

//反射
func main() {

	var num float64 = 1.234
	reflectNum(num)
	user := User{1, "lisi", 55}
	fmt.Println(user)
	DofiledAndMethod(user)
}

//DofiledAndMethod  |这个讲解更详细 https://www.cnblogs.com/turling/p/11667441.html
func DofiledAndMethod(input interface{}) {
	//获取input的type
	inputType := reflect.TypeOf(input)
	fmt.Println("inputType is :", inputType.Name())

	inputValue := reflect.ValueOf(input)
	fmt.Println("inputValue is:", inputValue)

	//通过type获取里面的字段
	//1 获取每个字段
	for i := 0; i < inputType.NumField(); i++ {
		field := inputType.Field(i)
		value := inputValue.Field(i)
		fmt.Printf("%s:%v  =%v \n", field.Name, field.Type, value)
	}

	fmt.Println("numMethod:", inputType.NumMethod())
	//反射获取方法
	for i := 0; i < inputType.NumMethod(); i++ {
		//指针和 普通 变量 传递进来 得到的方法不一样多。
		method := inputType.Method(i)
		fmt.Println(method.Name, method.Type)
	}
}
